﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using ContratanteService.Dominio;

namespace OfertanteService.Persistencia
{
    public class OfertanteDAO
    {
        public List<Ofertante> BuscarOfertantes(string nombre, string dep, string prov, string dist, string cat, string prod)
        {

            List<Ofertante> todos = new List<Ofertante>();
            string sql = "select distinct o.idOfertante,o.numDocOfertante,o.rznSocOfertante,o.dirOfertante,o.numTelOfertante from ofertante o " +
                            "left join cartera_ofertante co on co.idOfertante = o.idOfertante " +
                            "left join producto p on p.idProducto = co.idProducto " +
                            "where stdRegistro = 1 ";

            if (nombre == null || nombre == "0")
            {
            }
            else
            {
                sql += "and o.rznSocOfertante like '%" + nombre + "%' ";
            }

            if (dep == null || dep == "0")
            {
            }
            else
            {
                sql += "and o.idDepartamento = '" + dep + "' ";
            }
            if (prov == null || prov == "0")
            {
            }
            else
            {
                sql += "and o.idProvincia = '" + prov + "' ";
            }
            if (dist == null || dist == "0")
            {
            }
            else
            {
                sql += "and o.idDistrito = '" + dist + "' ";
            }
            if (cat == null || cat == "0")
            {
            }
            else
            {
                sql += "and p.idCategoria = '" + cat + "' ";
            }
            if (prod == null || prod == "0")
            {
            }
            else
            {
                sql += "and co.idProducto = '" + prod + "' ";
            }

            using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    using (SqlDataReader resultado = com.ExecuteReader())
                    {
                        while (resultado.Read())
                        {
                            Ofertante a = new Ofertante()
                            {
                                CodOfertante = (int)resultado["idOfertante"],
                                RazonSocial = (string)resultado["rznSocOfertante"],
                                NumDocOfertante = (string)resultado["numDocOfertante"],
                                DirecOfertante = (string)resultado["dirOfertante"],
                                NumTelefOfertante = (string)resultado["numTelOfertante"]
                            };
                            todos.Add(a);
                        }
                    }
                }
            }
            return todos;
        }

        public List<Ofertante> ListarTodos(int tipo)
        {
            List<Ofertante> ofertantesEncontrados = new List<Ofertante>();
            Ofertante ofertanteEncontrado = null;
            string sql = "SELECT * FROM Ofertante";
            switch (tipo)
            {
                case 0: 
                    //Pendientes de aprobación
                    sql = sql + " WHERE stdRegistro = 0";
                    break;
                case 2:
                    //Ofertantes reportados
                    sql = sql + " WHERE stdRegistro = 2";
                    break;
                case 1:
                    //Ofertantes aprobados y reportados
                    sql = sql + " WHERE stdRegistro in (1,2)";
                    break;
            }
            using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    using (SqlDataReader resultado = com.ExecuteReader())
                    {
                        while (resultado.Read())
                        {
                            ofertanteEncontrado = new Ofertante()
                            {
                                CodOfertante = (int)resultado["idOfertante"],
                                TipoDocOfertante = "RUC",
                                RazonSocial = (string)resultado["rznSocOfertante"],
                                NumDocOfertante = (string)resultado["numDocOfertante"],
                                DirecOfertante = (string)resultado["dirOfertante"],
                                NumTelefOfertante = (string)resultado["numTelOfertante"],
                                EmailOfertante = (string)resultado["eMailOfertante"],
                                StdRegistro = (int)resultado["stdRegistro"]
                            };
                            ofertantesEncontrados.Add(ofertanteEncontrado);
                        }
                    }
                }
            }
            return ofertantesEncontrados;
        }

        public Ofertante Obtener(int id)
        {
            Ofertante ofertanteEncontrado = null;
            string sql = "SELECT * FROM Ofertante WHERE idOfertante=@id";
            using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.Add(new SqlParameter("@id", id));
                    using (SqlDataReader resultado = com.ExecuteReader())
                    {
                        if (resultado.Read())
                        {
                            ofertanteEncontrado = new Ofertante();
                            ofertanteEncontrado.CodOfertante = (int)resultado["idOfertante"];
                            ofertanteEncontrado.TipoDocOfertante = "RUC";
                            ofertanteEncontrado.RazonSocial = (string)resultado["rznSocOfertante"];
                            ofertanteEncontrado.NumDocOfertante = (string)resultado["numDocOfertante"];
                            ofertanteEncontrado.DirecOfertante = (string)resultado["dirOfertante"];
                            ofertanteEncontrado.NumTelefOfertante = (string)resultado["numTelOfertante"];
                            ofertanteEncontrado.EmailOfertante = (string)resultado["eMailOfertante"];
                            if (resultado["stdRegistro"] != null)
                            {
                                ofertanteEncontrado.StdRegistro = (int)resultado["stdRegistro"];
                            }
                        }
                    }
                }
            }
            return ofertanteEncontrado;
        }

        public Ofertante Modificar(Ofertante ofertanteAModificar)
        {
            Ofertante ofertanteModificado = null;
            string sql = "UPDATE Ofertante SET stdRegistro=@std, dscRechazo=@rec WHERE idOfertante=@id";
            using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.Add(new SqlParameter("@std", ofertanteAModificar.StdRegistro));
                    com.Parameters.Add(new SqlParameter("@id", ofertanteAModificar.CodOfertante));
                    com.Parameters.Add(new SqlParameter("@rec", ofertanteAModificar.DscRechazo));
                    com.ExecuteNonQuery();
                }
            }
            ofertanteModificado = Obtener(ofertanteAModificar.CodOfertante);
            return ofertanteModificado;
        }


        public Ofertante Crear(Ofertante ofertanteACrear)
        {
            Ofertante ofertanteModificado = null;
            string sql = "INSERT Ofertante INTO VALUES @idOfertante,@eMailOfertante,@numDocOfertante,@passOfertante,@usuOfertante,@rznSocOfertante,@dirOfertante ,@numTelOfertante,@idDocIdentidad,@flgMembresia,@stdRegistro,@dscRechazo,@idDistrito,@idProvincia,@idDepartamento";
            using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.Add(new SqlParameter("@idOfertante", ofertanteACrear.CodOfertante));
                    com.Parameters.Add(new SqlParameter("@eMailOfertante", ofertanteACrear.EmailOfertante));
                    com.Parameters.Add(new SqlParameter("@numDocOfertante", ofertanteACrear.NumDocOfertante));
                    com.Parameters.Add(new SqlParameter("@passOfertante", ofertanteACrear.ClaveOfertante));
                    com.Parameters.Add(new SqlParameter("@usuOfertante", ofertanteACrear.UsuarioOfertante));
                    com.Parameters.Add(new SqlParameter("@rznSocOfertante", ofertanteACrear.RazonSocial));
                    com.Parameters.Add(new SqlParameter("@dirOfertante", ofertanteACrear.DirecOfertante));
                    com.Parameters.Add(new SqlParameter("@numTelOfertante", ofertanteACrear.NumTelefOfertante));
                    com.Parameters.Add(new SqlParameter("@idDocIdentidad", ofertanteACrear.CodTipoDocumento));
                    com.Parameters.Add(new SqlParameter("@flgMembresia", ofertanteACrear.FlgMembresia));
                    com.Parameters.Add(new SqlParameter("@stdRegistro", "A")); // Por defecto Activo
                    com.Parameters.Add(new SqlParameter("@dscRechazo", "" )); // Ya que es un ofertante nuevo

                    com.Parameters.Add(new SqlParameter("@idDistrito", ofertanteACrear.CodDistrito));
                    com.Parameters.Add(new SqlParameter("@idProvincia", ofertanteACrear.CodProvincia));
                    com.Parameters.Add(new SqlParameter("@idDepartamento", ofertanteACrear.CodDepartamento));
                             
                    com.ExecuteNonQuery();
                }
            }


            // Para el TEST
            ofertanteModificado = Obtener(ofertanteACrear.CodOfertante);
            return ofertanteModificado;
        }


           public Producto CrearProducto(Producto productoACrear)
        {
            Producto productoCreado = null;
            string sql = "INSERT Producto INTO VALUES @idProducto, @nomProducto ,@dscGrlProducto,@dscDetProducto,@idCategoria";
            using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.Add(new SqlParameter("@idProducto", productoACrear.CodProducto));
                    com.Parameters.Add(new SqlParameter("@nomProducto", productoACrear.NomProducto));
                    com.Parameters.Add(new SqlParameter("@dscGrlProducto", productoACrear.DesGrlProducto));
                    com.Parameters.Add(new SqlParameter("@dscDetProducto", productoACrear.DesDetProducto));
                    com.Parameters.Add(new SqlParameter("@idCategoria", productoACrear.CodCategoria));
                      
                    com.ExecuteNonQuery();
                }
            }


            // Para el TEST
            productoCreado = ObtenerProducto(productoACrear.CodProducto);
            return productoCreado;
        }



           public Producto ObtenerProducto(string id)
           {
               Producto productoEncontrado = null;
               string sql = "SELECT * FROM Producto WHERE idProducto=@id";
               using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerCadena()))
               {
                   con.Open();
                   using (SqlCommand com = new SqlCommand(sql, con))
                   {
                       com.Parameters.Add(new SqlParameter("@id", id));
                       using (SqlDataReader resultado = com.ExecuteReader())
                       {
                           if (resultado.Read())
                           {
                               productoEncontrado = new Producto()
                               {
                                   CodProducto = (string)resultado["idProducto"],
                                   NomProducto = (string)resultado["nomProducto"],
                                   DesGrlProducto = (string)resultado["dscGrlProducto"],
                                   DesDetProducto = (string)resultado["dscDetProducto"],
                                   CodCategoria = (string)resultado["idCategoria"]
                                   
                               };
                           }
                       }
                   }
               }
               return productoEncontrado;
           }



    }
}
